package com.asialjim.wechat.apiservice.constant;

import java.util.HashMap;
import java.util.Map;

/**
 * <h1><em>ASIAL JIM JAVA DOC</em></h1><hr/>
 * <h2>CLASS DESCRIPTION <i>[ NAME: ${NAME} ]</i></h2><strong>
 * <p> the constant of we chat sdk
 * </strong><p><p><em>Copyright &copy; Asial Jim Co., LTD</em><hr/>
 *@author Asial Jim &nbsp;&nbsp; <span>Email:<a href="mailto:asialjim@hotmail.com">asialjim@hotmail.com</a> &nbsp;&nbsp; <a href="asialjim@qq.com">asialjim@qq.com</a></span>
 *@since 2021/1/26   &nbsp;&nbsp; JDK 8
 *@version 1.0.0
 */
public interface WeChatConstants {

    /**
     * 字符串常量
     */
    interface StringConstants{
        String EMPTY_STRING = "";
        String ACCESS_TOKEN_EQUALS = "access_token=%s";
    }

    /**
     * 微信服务器推送到开发者服务器的消息类型
     */
    interface InputXmlMsgType{
        String TEXT = "text";               // 文本
        String IMAGE = "image";             // 图片
        String VOICE = "voice";             // 声音
        String SHORTVIDEO = "shortvideo";   // 小视频
        String VIDEO = "video";             // 视频
        String MUSIC = "music";             // 音乐
        String LOCATION = "location";       // 地理位置
        String LINK = "link";               // 链接
        String EVENT = "event";             // 事件

        String DEVICE_TEXT = "device_text";
        String DEVICE_EVENT = "device_event";
        String DEVICE_STATUS = "device_status";
        String HARDWARE = "hardware";
        String TRANSFER_CUSTOMER_SERVICE = "transfer_customer_service";
    }

    /**
     * 开发者收到微信服务器推送的消息后被动回复的消息类型
     */
    interface OutputXmlMsgType{
        String TEXT = "text";       // 文本
        String IMAGE = "image";     // 图片
        String VOICE = "voice";     // 声音
        String VIDEO = "video";     // 视频
        String MUSIC = "music";     // 音乐
        String NEWS = "news";       // 图文
        String TRANSFER_CUSTOMER_SERVICE = "transfer_customer_service";
    }

    /**
     * 微信服务器推送到开发者服务器的事件类型
     */
    interface InputXmlEventType{
        String SUBSCRIBE = "subscribe";     // 关注事件
        String UNSUBSCRIBE = "unsubscribe"; // 取关事件
        String CLICK = "CLICK";             // 点击自定义菜单事件
        String LOCATION = "LOCATION";       // 上报地理位置事件
        String SCAN = "SCAN";               // 扫码事件
        String VIEW = "VIEW";               // 菜单跳转链接事件
        String MASSSENDJOBFINISH = "MASSSENDJOBFINISH";             // 群发消息回调事件

        String SCANCODE_PUSH = "scancode_push";                     // 扫码推事件的事件
        String SCANCODE_WAITMSG = "scancode_waitmsg";               // 扫码推事件且弹出“消息接受中”提示框的事件
        String PIC_SYSPHOTO = "pic_sysphoto";                       // 弹出系统拍照发图的事件
        String PIC_PHOTO_OR_ALBUM = "pic_photo_or_album";           // 弹出拍照或者相册发图的事件推送
        String PIC_WEIXIN = "pic_weixin";                           // 弹出微信相册发图器的事件推送
        String LOCATION_SELECT = "location_select";                 // 弹出地理位置选择器的事件推送
        String TEMPLATE_SEND_JOB_FINISH = "TEMPLATESENDJOBFINISH";  // 模板消息发送完成回调事件
        String MERCHANT_ORDER = "merchant_order";                   // 小店订单付款通知事件
        String CARD_PASS_CHECK = "card_pass_check";                 // 卡券通过审核事件
        String CARD_NOT_PASS_CHECK = "card_not_pass_check";         // 卡券未通过审核事件
        String CARD_USER_GET_CARD = "user_get_card";                                // 用户领取卡券事件
        String CARD_USER_GIFTING_CARD = "user_gifting_card";                        // 用户转增卡券事件
        String CARD_USER_CONSUME_CARD = "user_consume_card";                        // 用户核销卡券事件
        String CARD_USER_PAY_FROM_PAY_CELL = "user_pay_from_pay_cell";              // 用户通过卡券完成微信买单事件
        String CARD_SUBMIT_MEMBERCARD_USER_INFO = "submit_membercard_user_info";    // 用户提交会员卡开卡信息事件
        String CARD_USER_VIEW_CARD = "user_view_card";                              // 用户查看卡券事件
        String CARD_USER_DEL_CARD = "user_del_card";                                // 用户删除卡券事件
        String CARD_USER_ENTER_SESSION_FROM_CARD = "user_enter_session_from_card";  // 用户在卡券点击查看公众号进入会话事件(需关注公众号）
        String CARD_UPDATE_MEMBER_CARD = "update_member_card";                      // 用户会员卡积分余额发生变动事件
        String CARD_SKU_REMIND = "card_sku_remind";                                 // 某个卡券初始库存数大于200，当前库存小于100时，用户尝试领用卡券出发事件
        String CARD_PAY_ORDER = "card_pay_order";                                   // 商户朋友卡券券点发生变动事件
        String WEAPP_AUDIT_SUCCESS = "weapp_audit_success";                         // 小程序审核通过事件
        String WEAPP_AUDIT_FAIL = "weapp_audit_fail";                               // 小程序审核不通过事件

        String VIEW_MINI_PROGRAM = "view_miniprogram";                              // 点击菜单跳转小程序推送事件
    }

    /**
     * 客服消息类型
     */
    interface CustomServiceMsgType{
        String TEXT = "text";       // 文本
        String IMAGE = "image";     // 图片
        String VOICE = "voice";     // 声音
        String VIDEO = "video";     // 视频
        String MUSIC = "music";     // 音乐
        String NEWS = "news";       // 图文（点击跳转到外链），图文消息条数限制在1条以内,否则会报45008错误
        String MPNEWS = "mpnews";   // 图文（点击跳转到图文消息页面），图文消息条数限制在1条以内，否则会报45008错误
        String MSGMENU = "msgmenu"; // 发送菜单消息
        String WXCARD = "wxcard";   // 发送卡券，投放卡券仅支持非自定义Code码和导入code模式的卡券的卡券
        String MINIPROGRAMPAGE = "miniprogrampage";                         // 发送小程序卡片，要求小程序与公众号已关联

        String FILE = "file";                                               // 发送文件，企业号专用
        String TEXTCARD = "textcard";                                       // 文本卡片消息，企业号专用
        String TRANSFER_CUSTOMER_SERVICE = "transfer_customer_service";     // 转发到客服的消息
        String TASKCARD = "taskcard";                                       // 任务卡片消息
        String MINIPROGRAM_NOTICE = "miniprogram_notice";                   // 小程序通知消息
    }

    /**
     * 自动回复消息类型（包含关注后自动回复和关键词自动回复）
     */
    interface AutoReplyMsgType{
        String TEXT = "text";       // 文本
        String IMG = "img";         // 图片
        String VOICE = "voice";     // 声音
        String VIDEO = "video";     // 视频
        String NEWS = "news";       // 图文（仅限于关键词自动回复）
    }

    /**
     * 群发消息类型
     */
    interface MassMsgType{
        String MPNEWS = "mpnews";   // 图文
        String TEXT = "text";       // 文本
        String VOICE = "voice";     // 声音
        String IMAGE = "image";     // 图片
        String MPVIDEO = "mpvideo"; // 视频
        String WXCARD = "wxcard";   // 卡券
    }

    /**
     * 群发消息后微信端推送给服务器的反馈消息代码
     */
    class MassMsgStatus {
        public static final Map<String, String> STATUS_DESC = new HashMap<>();

        public static final String SEND_SUCCESS = "send success";
        public static final String SEND_FAIL = "send fail";
        public static final String ERR_10001 = "err(10001)";
        public static final String ERR_20001 = "err(20001)";
        public static final String ERR_20004 = "err(20004)";
        public static final String ERR_20002 = "err(20002)";
        public static final String ERR_20006 = "err(20006)";
        public static final String ERR_20008 = "err(20008)";
        public static final String ERR_20013 = "err(20013)";
        public static final String ERR_22000 = "err(22000)";
        public static final String ERR_21000 = "err(21000)";

        static {
            STATUS_DESC.put(SEND_SUCCESS, "发送成功");
            STATUS_DESC.put(SEND_FAIL, "发送失败");
            STATUS_DESC.put(ERR_10001, "涉嫌广告");
            STATUS_DESC.put(ERR_20001, "涉嫌政治");
            STATUS_DESC.put(ERR_20004, "涉嫌社会");
            STATUS_DESC.put(ERR_20002, "涉嫌色情");
            STATUS_DESC.put(ERR_20006, "涉嫌违法犯罪");
            STATUS_DESC.put(ERR_20008, "涉嫌欺诈");
            STATUS_DESC.put(ERR_20013, "涉嫌版权");
            STATUS_DESC.put(ERR_22000, "涉嫌互推_互相宣传");
            STATUS_DESC.put(ERR_21000, "涉嫌其他");
        }
    }

    /**
     * 上传多媒体（临时素材）文件的类型.
     */
    interface MediaFileType {
        String IMAGE = "image";     // 图片
        String VOICE = "voice";     // 声音
        String VIDEO = "video";     // 视频
        String THUMB = "thumb";     // 缩略图
        String FILE = "file";       // 文件
    }

    /**
     * 永久素材类型.
     */
    interface MaterialType {
        String NEWS = "news";       // 文本
        String VOICE = "voice";     // 语音
        String IMAGE = "image";     // 图片
        String VIDEO = "video";     // 视频
    }

    /**
     * 自定义菜单的按钮类型.
     */
    interface MenuButtonType {
        String CLICK = "click";                             // 单击事件菜单
        String VIEW = "view";                               // 跳转外链菜单
        String MINIPROGRAM = "miniprogram";                 // 跳转小程序菜单
        String SCANCODE_PUSH = "scancode_push";             // 扫码推事件菜单
        String SCANCODE_WAITMSG = "scancode_waitmsg";       // 扫码推事件且弹出“消息接受中”提示框
        String PIC_SYSPHOTO = "pic_sysphoto";               // 弹出系统拍照发图
        String PIC_PHOTO_OR_ALBUM = "pic_photo_or_album";   // 弹出拍照或者相册发图
        String PIC_WEIXIN = "pic_weixin";                   // 弹出微信相册发图器
        String LOCATION_SELECT = "location_select";         // 弹出地理位置选择器
        String MEDIA_ID = "media_id";                       // 下发非文本消息
        String VIEW_LIMITED = "view_limited";               // 跳转图文消息url
    }

    /**
     * oauth2网页授权的scope.
     */
    interface OAuth2Scope {
        String SNSAPI_BASE = "snsapi_base";                 // 不弹出授权页面，仅获取OpenId
        String SNSAPI_USERINFO = "snsapi_userinfo";         // 弹出授权页面，获取OpenId,昵称，性别，所在地，用户授权后还能获取更多消息
        String SNSAPI_PRIVATEINFO = "snsapi_privateinfo";   // 手动授权，可获取用户详细信息，包含手机，邮箱等，仅适用于企业微信或者企业号
    }

    /**
     * 网页应用登录授权作用域.
     */
    interface QrConnectScope {
        String SNSAPI_LOGIN = "snsapi_login";       // 网页应用登录
    }

    /**
     * 网络检测入参.
     */
    interface NetCheckArgs {
        String ACTIONDNS = "dns";
        String ACTIONPING = "ping";
        String ACTIONALL = "all";
        String OPERATORUNICOM = "UNICOM";
        String OPERATORCHINANET = "CHINANET";
        String OPERATORCAP = "CAP";
        String OPERATORDEFAULT = "DEFAULT";
    }

    /**
     * <h3>FIELD DESCRIPTION</h3>
     * 微信公众平台接口域名
     */
    interface WeChatApiDomain{
        String
        // 通用域名
        COMMON_DOMAIN = "https://api.weixin.qq.com",
        // 异地容灾域名
        COMMON_DOMAIN_2 = "https://api2.weixin.qq.com",
        // 上海域名
        SHANGHAI_DOMAIN = "https://sh.api.weixin.qq.com",
        // 深圳域名
        SHENZHEN_DOMAIN = "https://sz.api.weixin.qq.com",
        // 香港域名
        HONGKONG_DOMAIN = "https://hk.api.weixin.qq.com";
    }

    /**
     * 微信api网络
     */
    interface WeChatApiUrl{
        String

        /**
         * 获取接口调用令牌
         */
        GET_ACCESS_TOKEN =  "/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s",

        /**
         * 获取js接口调用令牌
         */
        GET_JS_ACCESS_TOKEN =   "/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code",


        GET_JS_ACCESS_TOKEN_REFRESH = "/sns/oauth2/refresh_token?appid=%s&grant_type=refresh_token&refresh_token=%s",

        /**
         * 获取微信服务器ip列表
         */
        GET_CALLBACK_IP = "/cgi-bin/getcallbackip?access_token=%s",

        /**
         * 网络检测API
         */
        POST_CALLBACK_CHECK = "/cgi-bin/callback/check?access_token=%s",

        /**
         * 创建自定义菜单
         */
        POST_MENU_CREATE = "/cgi-bin/menu/create?access_token=%s",

        /**
         * 获取自定义菜单列表
         */
        GET_MENU_LIST =   "/cgi-bin/get_current_selfmenu_info?access_token=%s",

        /**
         * 删除自定义菜单，此动作会删除整个默认菜单和自定义菜单，慎重使用
         */
        GET_MENU_DELETE =   "/cgi-bin/menu/delete?access_token=%s",

        /**
         * 创建个性化菜单
         */
        POST_MENU_ADDCONDITIONAL =   "/cgi-bin/menu/addconditional?access_token=%S",

        /**
         * 删除个性化菜单
         */
        POST_MENU_DELCONDITIONAL =   "/cgi-bin/menu/delconditional?access_token=%s",

        /**
         * 测试个性化菜单匹配结果
         */
        POST_MENU_TRY_MATCH =   "/cgi-bin/menu/trymatch?access_token=%s",

        /**
         * 获取自定义菜单配置
         */
        GET_MENU_INFO =   "/cgi-bin/menu/get?access_token=%s",

        /**
         * 添加客服账号
         */
        POST_CUSTOM_SERVICE_ADD =   "/customservice/kfaccount/add?access_token=%s",

        /**
         * 修改客服账号
         */
        POST_CUSTOM_SERVICE_UPDATE =   "/customservice/kfaccount/update?access_token=%s",

        /**
         * 删除客服账号
         */
        POST_CUSTOM_SERVICE_DELETE =   "/customservice/kfaccount/del?access_token=%s",

        /**
         * 设置客服账号头像
         */
        POST_CUSTOM_SERVICE_HEADURL_UPLOAD =   "/customservice/kfaccount/uploadheadimg?access_token=%s&kf_account=%s",

        /**
         * 获取客服列表
         */
        GET_CUSTOM_SERVICE_LIST =   "/cgi-bin/customservice/getkflist?access_token=%s",

        /**
         * 发送客服消息
         */
        POST_MESSAGE_CUSTOM_SEND =   "/cgi-bin/message/custom/send?access_token=%s",

        /**
         * 下发客服输入状态
         */
        POST_MESSAGE_CUSTOM_TYPING =   "/cgi-bin/message/custom/typing?access_token=%s",

        /**
         * 上传图文消息内的图片，并获取图片url
         */
        POST_MEDIA_UPLOADING =   "/cgi-bin/media/uploadimg?access_token=%s",

        /**
         * 上传图文消息素材
         */
        POST_MEDIA_UPLOAD_NEWS =   "/cgi-bin/media/uploadnews?access_token=%s",

        /**
         * 根据标签进行群发
         */
        POST_MESSAGE_MASS_SENDALL =   "/cgi-bin/message/mass/sendall?access_token=%s",

        /**
         * 获取视频素材的mediaId
         */
        POST_MEDIA_UPLOAD_VIDEO =   "/cgi-bin/media/uploadvideo?access_token=%s",

        /**
         * 通过OpenId群发
         */
        POST_MESSAGE_MASS_SEND =   "/cgi-bin/message/mass/send?access_token=%s",

        /**
         * 删除群发
         */
        POST_MESSAGE_MASS_DEL =   "/cgi-bin/message/mass/delete?access_token=%s",

        /**
         * 群发预览
         */
        POST_MESSAGE_MASS_PREVIEW =   "/cgi-bin/message/mass/preview?access_token=%s",

        /**
         * 查询群发状态
         */
        POST_MESSAGE_MASS_STATUS =   "/cgi-bin/message/mass/get?access_token=%s",

        /**
         * 获取群发速度
         */
        POST_MESSAGE_MASS_SPEED_INFO =   "/cgi-bin/message/mass/speed/get?access_token=%s",

        /**
         * 设置群发速度
         */
        POST_MESSAGE_MASS_SPEED_SET =   "/cgi-bin/message/mass/speed/set?access_token=%s",

        /**
         * 设置公众号行业
         *      设置行业可在微信公众平台后台完成，每月可修改行业1次，帐号仅可使用所属行业中相关的模板，为方便第三方开发者，提供通过接口调用的方式来修改账号所属行业
         */
        POST_TEMPLATE_INDUSTRY_SET =   "/cgi-bin/template/api_set_industry?access_token=%s",

        /**
         * 获取公众号设置的行业
         *      获取帐号设置的行业信息。可登录微信公众平台，在公众号后台中查看行业信息。为方便第三方开发者，提供通过接口调用的方式来获取帐号所设置的行业信息
         */
        GET_TEMPLATE_INDUSTRY_INFO =   "/cgi-bin/template/get_industry?access_token=%s",

        /**
         * 添加模板，并获取模板号
         *      从行业模板库选择模板到帐号后台，获得模板ID的过程可在微信公众平台后台完成。为方便第三方开发者，提供通过接口调用的方式来获取模板ID
         */
        POST_TEMPLATE_ADD =   "/cgi-bin/template/api_add_template?access_token=%s",

        /**
         * 获取当前公众号的所有模板
         *      获取已添加至帐号下所有模板列表，可在微信公众平台后台中查看模板列表信息。为方便第三方开发者，提供通过接口调用的方式来获取帐号下所有模板信息
         */
        GET_TEMPLATE_PRIVATE_LIST =   "/cgi-bin/template/get_all_private_template?access_token=%s",

        /**
         * 删除当前公众号的某个模板
         *      删除模板可在微信公众平台后台完成，为方便第三方开发者，提供通过接口调用的方式来删除某帐号下的模板
         */
        POST_TEMPLATE_PRIVATE_DEL =   "/cgi-bin/template/del_private_template?access_token=%s",

        /**
         * 发送模板消息
         */
        POST_TEMPLATE_MESSAGE_SEND =   "/cgi-bin/message/template/send?access_token=%s",

        /**
         * <h3>FIELD DESCRIPTION</h3>
         * <p>一次性订阅消息授权
         * <pre>在确保微信公众帐号拥有订阅消息授权的权限的前提下（已认证的公众号即有权限，可登录公众平台在接口权限列表处查看），引导用户在微信客户端打开如下链接
         * <table border="10">
         *     <tr>
         *         <th>参数</th>
         *         <th>是否必须</th>
         *         <th>说明</th>
         *     </tr>
         *     <tr>
         *         <td>action</td>
         *         <td>是</td>
         *         <td>直接填get_confirm即可</td>
         *     </tr>
         *     <tr>
         *         <td>appid</td>
         *         <td>是</td>
         *         <td>公众号的唯一标识</td>
         *     </tr>
         *     <tr>
         *         <td>scene</td>
         *         <td>是</td>
         *         <td>重定向后会带上scene参数，开发者可以填0-10000的整形值，用来标识订阅场景值</td>
         *     </tr>
         *     <tr>
         *         <td>template_id</td>
         *         <td>是</td>
         *         <td>订阅消息模板ID，登录公众平台后台，在接口权限列表处可查看订阅模板ID</td>
         *     </tr>
         *     <tr>
         *         <td>redirect_url</td>
         *         <td>是</td>
         *         <td>授权后重定向的回调地址，请使用UrlEncode对链接进行处理。 注：要求redirect_url的域名要跟登记的业务域名一致，且业务域名不能带路径。 业务域名需登录公众号，在设置-公众号设置-功能设置里面对业务域名设置。</td>
         *     </tr>
         *     <tr>
         *         <td>reserved</td>
         *         <td>否</td>
         *         <td>用于保持请求和回调的状态，授权请后原样带回给第三方。该参数可用于防止csrf攻击（跨站请求伪造攻击），建议第三方带上该参数，可设置为简单的随机数加session进行校验，开发者可以填写a-zA-Z0-9的参数值，最多128字节，要求做urlencode</td>
         *     </tr>
         * </table>
         */
        GET_SUBSCRIBE_MSG = "https://mp.weixin.qq.com/mp/subscribemsg?action=get_confirm&appid=%s&scene=%s&template_id=%s&redirect_url=%s&reserved=%s#wechat_redirect",

        /**
         * 发送一次性订阅模板消息
         */
        POST_TEMPLATE_MESSAGE_SUBSCRIBE_SEND =   "/cgi-bin/message/template/subscribe?access_token=%s",

        /**
         * 获取公众号自动回复规则
         */
        GET_AUTO_REPLY_INFO =   "/cgi-bin/get_current_autoreply_info?access_token=%s",

        /**
         * 对所有api接口调用次数清零
         */
        POST_CLEAR_QUOTA =   "/cgi-bin/clear_quota?access_token=%s",


        /**
         * 获取微信用户信息
         */
        GET_WECHAT_USER_INFO =   "/cgi-bin/user/info?access_token=%s&openid=%s&lang=zh_CN",

        /**
         * <h3>FIELD DESCRIPTION</h3>
         * 获取网页授权用户信息
         */
        GET_WECHAT_USER_INFO_AUTH = "/sns/userinfo?access_token=%s&openid=%s&lang=%s",

        /**
         * <h3>FIELD DESCRIPTION</h3>
         * 获取二维码票据
         */
        GET_QRCODE_TICKET = "/cgi-bin/qrcode/create?access_token=%s",

        /**
         * <h3>FIELD DESCRIPTION</h3>
         * 使用二维码票据展示二维码
         */
        GET_QRCODE = "/cgi-bin/showqrcode?ticket=%s",

        /**
         * <h3>FIELD DESCRIPTION</h3>
         * 使用通用微信api域名获取二维码图片
         */
        GET_QRCODE_BY_COMMON_DOMAIN = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=%s",

        /**
         * <h3>FIELD DESCRIPTION</h3>
         * 静默授权网页授权链接
         */
        GET_AUTH_PAGE_URL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_base&state=%s#wechat_redirect",

        /**
         * 占位链接
         */
        GET_ASIAL_JIM = "https://www.asialjim.com";
    }

}
